// package com.edan.partnerback.filter;
//
// import cn.hutool.http.HttpStatus;
// import cn.hutool.json.JSONUtil;
// import com.edan.partnerback.common.VO.Result;
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.http.MediaType;
// import org.springframework.stereotype.Component;
//
// import javax.servlet.*;
// import javax.servlet.http.HttpServletResponse;
// import java.io.IOException;
// import java.nio.charset.StandardCharsets;
// import java.util.concurrent.atomic.AtomicInteger;
//
// /**
//  * @Description 通过自定义过滤器实现并发接口限流问题
//  * @Author Edan
//  * @Create 2024/3/30 15:07
//  */
// @Component
// @Slf4j
// public class CurrentLimitFilter implements Filter {
//     private static final long LIMIT_TIME = 1000L;//限制区间
//     private static final int LIMIT_MAX_NUMBER = 100;//允许一秒中的并发访问数
//     private static final AtomicInteger bear = new AtomicInteger();
//     private volatile static long startTime = System.currentTimeMillis();
//
//     @Override
//     public void init(FilterConfig filterConfig) throws ServletException {
//         Filter.super.init(filterConfig);
//     }
//
//     @Override
//     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//         int count = bear.incrementAndGet();
//         if (count == 1) {//并发安全
//             startTime = System.currentTimeMillis();
//         }
//         if (startTime + LIMIT_TIME >= System.currentTimeMillis()) {
//             if (count > LIMIT_MAX_NUMBER) {
//                 log.info("拒绝访问，请求太过频繁");
//                 HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
//                 httpServletResponse.setStatus(HttpStatus.HTTP_NOT_AUTHORITATIVE);
//                 httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
//                 httpServletResponse.setCharacterEncoding(StandardCharsets.UTF_8.name());
//                 httpServletResponse.getWriter().print(JSONUtil.toJsonStr(Result.error("403", "请求太过频繁")));
//                 return;//拒绝访问
//             }
//         } else {
//             //进入下一个限流窗口
//             bear.set(1);
//             startTime = System.currentTimeMillis();
//         }
//         //放行
//         filterChain.doFilter(servletRequest, servletResponse);
//     }
//
//     @Override
//     public void destroy() {
//         Filter.super.destroy();
//     }
// }
